/*******************************************************************************
 * Copyright (c) 2000, 2002 IBM Corporation and others. All rights reserved.
 * This program and the accompanying materials are made available under the
 * terms of the Common Public License v0.5 which accompanies this distribution,
 * and is available at http://www.eclipse.org/legal/cpl-v05.html
 * 
 * Contributors: IBM - Initial API and implementation Boris Pruessmann -
 * Cleanup, documentation
 ******************************************************************************/
package net.sourceforge.perforce.core.internal.utils;

import com.google.common.collect.Lists;

import net.sourceforge.perforce.core.internal.Policy;

import java.util.List;

/**
 * A FileNameMatcher associates a String with a String pattern.
 * 
 * Note: code copied from org.eclipse.team.internal.ccvs.core.util on Nov 7th
 * 2002.
 */
public class FileNameMatcher {
  // ---------------------------------------------------------------------------
  // Private Constants

  private static final String TRUE = "true"; //$NON-NLS-1$

  // ---------------------------------------------------------------------------
  // Private Variables

  private List<StringMatcher> matchers = Lists.newArrayList();
  private List<String> results = Lists.newArrayList();

  // -------------------------------------------------------------------------
  // Public Constructors

  public FileNameMatcher() {
  }

  public FileNameMatcher(String[] patterns) {
    register(patterns);
  }

  //----------------------------------------------------------------------------
  // -- Public Methods

  public void register(String pattern, String result) {
    Policy.assertTrue(matchers.size() == results.size());

    pattern = pattern.trim();

    // The empty pattern matches everything, but we want to match
    // nothing with it, so we just do not register anything
    if (pattern.length() == 0) {
      return;
    }

    matchers.add(new StringMatcher(pattern, false, false));
    results.add(result);

  }

  public String getMatch(String name) {
    for (int i = 0; i < matchers.size(); i++) {
      StringMatcher stringMatcher = matchers.get(i);
      if (stringMatcher.match(name)) {
        return results.get(i);
      }
    }

    return null;
  }

  public boolean match(String name) {
    return getMatch(name) != null;
  }

  //----------------------------------------------------------------------------
  // --------- Methods

  void register(String[] patterns) {
    for (int i = 0; i < patterns.length; i++) {
      register(patterns[i], TRUE);
    }
  }
}
